home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 026-050 / 045 / whereis / where.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  5KB  |  230 lines

  1. /* Find the file whose name matches that passed as first argument.
  2.  * Print the filename and its volume:path to the screen
  3.  */
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <exec/types.h>
  7. #include <devices/keymap.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/dosextens.h>
  10.  
  11. #define BELL 0x07
  12. /*
  13.  *                 F U N C T I O N     D E C L A R A T I O N S
  14.  */
  15. extern struct FileLock * Lock();
  16.  
  17. BOOL ifoundit;
  18. /* home grown subrs: */
  19. void close_things();
  20.  
  21. /*
  22.  *                  M A I N     P R O G R A M     M O D U L E
  23.  */
  24. void
  25. main( argc,argv)
  26. int argc;
  27. char * argv[];
  28. {
  29.     void scan_directory ();
  30.     struct FileLock * Lock ();
  31.     void UnLock ();
  32.     char * strcpy ();
  33.  
  34.     struct FileLock * dir;
  35.     struct FileInfoBlock * fb;
  36.     char path[130];            /* hold volume name */
  37.     char devname[32];
  38.     char searchfile[32];
  39.     char * ch;
  40.     UBYTE i;
  41.  
  42.     if ((argc > 3) || (argc == 1))
  43.         printf ("usage: whereis <filename> <devname>\n");
  44.     else
  45.         {
  46.         ifoundit = FALSE;
  47.         /* devname not specified */
  48.         if (argc == 2)
  49.             devname[0] = '\0';
  50.         else
  51.             {
  52.             for (i=0;i<32;i++)
  53.                 devname[i] = '\0';
  54.             strncpy (devname,argv[2],31);
  55.             }
  56.         strcpy (searchfile, argv[1]);
  57.         /* upcase input string, simplify matching process */
  58.         for (ch=searchfile; *ch != '\0'; ch++)
  59.             *ch = toupper (*ch);
  60.         /* Get Lock on disk */
  61.         if ( (dir = Lock (devname,ACCESS_READ)) == NULL)
  62.             {
  63.             printf ("Could not obtain lock on device %s\n",
  64.                 devname);
  65.             printf ("Then Die Ceasar\n");
  66.             close_things ();
  67.             exit (5);
  68.             }
  69.         else
  70.             strcpy (path, devname);
  71.         /* DO IT TO IT! */
  72.         scan_directory (searchfile,path);
  73.         }
  74.     close_things ();
  75. } /* end main */
  76.  
  77. /*
  78. .page.index close_index
  79. Do whatever final clean up is needed to leave the program.
  80.  */
  81. void
  82. close_things()
  83. {
  84.     if (!ifoundit)
  85.         printf ("Sorry, couldn't find it.\n");
  86.     return;
  87. } /* end close_things */
  88.  
  89.  
  90. /*
  91. .page.index scan_directory
  92.  */
  93. void
  94. scan_directory (searchfile,path)
  95. char * searchfile;
  96. char * path;
  97.     {
  98.     char * strcpy ();
  99.     void UnLock ();
  100.     struct FileLock * dir;
  101.     struct FileInfoBlock * fb;
  102.     char * adddir ();
  103.  
  104.     /* WE GOTTA BE STINGY WITH LOCAL STORAGE, THIS IS RECURSING!
  105.      * CAN'T EAT TOO MUCH STACK.
  106.      */
  107. #    define MAXSUB 50
  108.     char * subdir [MAXSUB];    /* Pointer area for Sub-Directories */
  109.     char pathname[130];    /* Pointers to AmigaDOS sub-directories */
  110.     UBYTE countdir,indexdir,i;
  111.     char testname[32];
  112.     char * ch;
  113.  
  114.     if (ifoundit)
  115.         return;
  116.     /* Get Lock on this directory */
  117.     if ( (dir = Lock (path,ACCESS_READ)) == NULL)
  118.         {
  119.         printf ("%cCould not obtain lock on directory %s\n",
  120.             BELL, path);
  121.         printf ("Then Die Ceasar\n");
  122.         close_things ();
  123.         exit (4);
  124.         }
  125.  
  126.     /* Examine lock and obtain FileInfoBlock */
  127.     fb=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),0);
  128.     if (!Examine (dir,fb))
  129.         {
  130.         printf ("%cCouldn't Examine files assoc with lock\n",BELL);
  131.         printf ("Then Die Ceasar\n");
  132.         UnLock (dir);
  133.         FreeMem ((char *)fb, sizeof (struct FileInfoBlock));
  134.         close_things ();
  135.         exit (4);
  136.         }
  137.     /* we now have dir and fb set up, 
  138.      * scan all files at this level 
  139.      * (remembering subdirectories)
  140.      */
  141.     countdir = 0;
  142.     while ((ExNext(dir,fb),IoErr() != ERROR_NO_MORE_ENTRIES) 
  143.         && (countdir <= MAXSUB)
  144.         && (!ifoundit)
  145.         ) 
  146.         {
  147.         if (fb->fib_DirEntryType > 0)
  148.             {
  149.             /* we have a subdirectory here... */
  150.             if (countdir < MAXSUB)
  151.                 subdir[countdir] = 
  152.                     adddir (fb->fib_FileName);
  153.             else
  154.                 printf ("%cToo few subdirectory slots\n",
  155.                     BELL);
  156.             countdir++;
  157.             }
  158.         else
  159.             {
  160.             /* compare fb->filename with searchfile */
  161.             for (i=0;i<32;i++)
  162.                 testname[i] = '\0';
  163.             strncpy (testname,fb->fib_FileName, 32);
  164.             testname[31] = '\0';
  165.             for (i = 0,ch=testname; (ch != '\0')&&(i<32); 
  166.                 i++,ch++)
  167.                 *ch = toupper (*ch);
  168. #            if 0
  169.             printf ("%s =?= %s\n",testname, searchfile);
  170. #            endif
  171.             if (strcmp (testname,searchfile)==0)
  172.                 {
  173.                 printf ("%s\t%s\n",testname,path);
  174.                 ifoundit = TRUE;
  175.                 }
  176.             }
  177.         } /* end while */
  178.     /* return these now, we're done, thank you. */
  179.     UnLock (dir);
  180.     FreeMem ((char *)fb, sizeof (struct FileInfoBlock));
  181.  
  182.     /* finished with this level, try one level down */
  183.     indexdir = 0;
  184.     while ((indexdir < countdir)&&(!ifoundit))
  185.         {
  186.         strcpy (pathname,path);
  187.         /* if no path delimiter, add one */
  188.         if (       (path[strlen(path)-1] != ':') 
  189.             && (path[strlen(path)-1] != '/') 
  190.             && (strlen(path) > 0))
  191.                   strcat (pathname,"/");
  192.         strcat (pathname,subdir[indexdir]);
  193.  
  194.         scan_directory (searchfile,pathname);
  195.  
  196.         /* and pick up litter left by adddir() */
  197.         FreeMem ((char *)subdir[indexdir],
  198.             strlen(subdir[indexdir])+1);
  199.         subdir[indexdir] = NULL;
  200.         indexdir++;
  201.         }
  202.  
  203.     return;
  204. }    /* end scan_directory */
  205.  
  206. /*
  207. .page.index adddir
  208.  ----------------------------------------------------------------------------
  209.     Allocate some memory and then copy string into it.
  210.  */
  211. char * adddir (string)
  212. char * string;
  213. {
  214.     char * nameadd;    /* Address of the directory name */
  215.  
  216.     nameadd = (char *) AllocMem (strlen(string)+1,0);
  217.     if (nameadd == NULL)
  218.         {
  219.         printf ("Not Enough Memory for Directories!!!\n");
  220.         /* run away! run away! */
  221.         close_things ();
  222.         exit (7);
  223.         }
  224.     strcpy (nameadd, string);
  225.  
  226.     /* return address of string you just alloated. */
  227.     return (nameadd);
  228.  
  229. }    /*end adddir*/
  230.